home *** CD-ROM | disk | FTP | other *** search
- #include "42.h"
- #include "42_plugin_manager.h"
- #include "42_plugin_ball.h"
-
- /* plugin definition */
-
- forty_two_plugin_api plugin_ball =
- {
- ball_init, // init
- ball_kill, // kill
- ball_idle, // idle1
- nil, // idle2
- nil, // click
- ball_ipc, // ipc
- nil, // update
- 22, // req_dialog_item
- (GWorldPtr) 0L // port
- };
-
-
- vector unsigned short balls[42];
- vector unsigned short ball_count = (vector unsigned short)(0);
-
- vector unsigned char lines[5];
- long state = 0;
- Handle ball_data;
-
- #define NextLine data -= (*(BallHand)ball_data)->rowbytes/4; data_line--;
-
-
- int ball_init(void)
- {
- ball_data = NewHandle(sizeof(tBallData));
-
- (*(BallHand)ball_data)->ball_base = (unsigned long *) (**(plugin_ball.port->portPixMap)).baseAddr;
- (*(BallHand)ball_data)->rowbytes = ((**(plugin_ball.port->portPixMap)).rowBytes & 0x3fff) / 4;
- (*(BallHand)ball_data)->color = 0;
- ball_reset();
- state = 0;
-
- lines[0] = (vector unsigned char)(7,1,7,7,5,7,7,7,7,7,7,4,7,1,7,7);
- lines[1] = (vector unsigned char)(5,1,1,1,5,4,4,1,5,5,5,4,4,1,1,4);
- lines[2] = (vector unsigned char)(5,1,7,3,7,7,7,1,7,7,7,7,4,7,6,7);
- lines[3] = (vector unsigned char)(5,1,4,1,1,1,5,1,5,1,5,5,4,5,4,4);
- lines[4] = (vector unsigned char)(7,1,7,7,1,7,7,1,7,1,5,7,7,7,7,4);
- }
-
- int ball_ipc(int sel, unsigned long msg)
- {
- switch(sel)
- {
- case BALL_COLOR:
- ball_color(msg);
- break;
- }
- }
-
- int ball_idle(void)
- {
-
- long i;
- long data_line;
- vector unsigned char * data;
- vector unsigned char shift_one = (vector unsigned char)(1);
- vector unsigned short one = (vector unsigned short)(1);
- vector unsigned short FFs = (vector unsigned short)(-1);
- vector unsigned short zero = (vector unsigned short)(0);
-
- vector unsigned short leftMask = (vector unsigned short)(-1);
- vector unsigned short rightMask = (vector unsigned short)(-1);
- vector unsigned short mask;
-
- vector unsigned short line;
- vector unsigned short theLine;
- vector unsigned short temp;
-
- leftMask= vec_sld(zero,leftMask,15);
- rightMask= vec_sld(rightMask,zero,1);
-
- data = (vector unsigned char *)&(*(BallHand)ball_data)->ball_base[(*(BallHand)ball_data)->rowbytes * 41];
-
- next_ball();
-
- line = (vector unsigned short)(1);
- data_line = 41;
-
- // Base Numbers
- for (i=0;i<5;i++)
- {
- theLine = vec_or(balls[data_line],line);
- draw_ball_line( theLine, data);
- NextLine;
- }
-
- temp = vec_or(line,vec_rl(line,one));
- temp = vec_or(temp,vec_rl(line,FFs));
- line = vec_xor(line,temp);
-
- // Draw the middle
- for (i=0; i< 7; i++)
- {
-
- theLine = vec_or(balls[data_line],temp);
- draw_ball_line( theLine, data);
- NextLine;
-
- theLine = vec_or(balls[data_line],line);
- draw_ball_line( theLine, data);
- NextLine;
-
- theLine = vec_or(balls[data_line],temp);
- draw_ball_line( theLine, data);
- NextLine;
-
- theLine = vec_or(balls[data_line],zero);
- draw_ball_line( theLine, data);
- NextLine;
-
- theLine = vec_or(balls[data_line],zero);
- draw_ball_line( theLine, data);
- NextLine;
-
- leftMask= vec_sld(zero,leftMask,15);
- rightMask= vec_sld(rightMask,zero,1);
- mask = vec_and(leftMask,rightMask);
-
- temp = vec_sld(temp,zero,1);
- temp = vec_and(mask,temp);
-
- line = vec_sld(line,zero,1);
- line = vec_and(mask,line);
- }
-
- // Draw the top two lines
- theLine = vec_or(balls[data_line],zero);
- draw_ball_line( theLine, data);
- NextLine;
-
- theLine = vec_or(balls[data_line],zero);
- draw_ball_line( theLine, data);
-
- (*plugin_ball.update)(&plugin_ball);
- }
-
- int ball_kill(void)
- {
- DisposeHandle(ball_data);
- }
-
- void ball_color(unsigned long color)
- {
- (*(BallHand)ball_data)->color = color;
-
- }
-
-
- #define lastState 9
- short left_shitf[42];
-
- void next_ball(void)
- {
- long i;
- vector unsigned short zero = (vector unsigned short)(0);
- vector unsigned char one = (vector unsigned char)(1);
- vector unsigned short newBall = (vector unsigned short)(0,0,0,3,0x8000,0,0,0);
- vector bool short test_result;
- vector unsigned short temp;
-
- vector unsigned short max = (vector unsigned short)(0x0fff);
-
- if ((state == 7) || (state == 8))
- balls[0] = newBall;
- else
- balls[0] = zero;
-
- for (i=1; i>0; i--)
- switch (state)
- {
- case 0:
- balls[i] = balls[i-1];
- break;
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- break;
- case 8:
- case 9:
- balls[i] = balls[i-1];
- break;
- }
-
- // balls[i] = balls[i-1];
-
- for (i=36; i>1; i--)
- {
- switch (state)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- if (left_shitf[i])
- balls[i] = vec_sll(balls[i],one);
- else
- balls[i] = vec_srl(balls[i],one);
- break;
- case 5:
- case 6:
- case 7:
- if (left_shitf[i])
- balls[i] = vec_sll(balls[i-1],one);
- else
- balls[i] = vec_srl(balls[i-1],one);
- break;
- case 8:
- case 9:
- balls[i] = balls[i-1];
- break;
- }
- }
- state++;
-
- for (i=41; i>0; i--)
- {
- left_shitf[i] = left_shitf[i-1];
- }
-
-
- if (state == 8)
- {
- test_result = vec_cmpeq(zero,balls[36]);
- temp = vec_sel((vector unsigned short)(1),zero,test_result);
-
- ball_count = vec_add(ball_count,temp);
-
- if (!vec_all_gt(max,ball_count))
- ball_count = zero;
-
-
- }
-
-
- if (state > lastState)
- {
- long j;
- vector unsigned char char1, char2;
- state = 0;
-
- for (i=41,j=4; i>36; i--,j--)
- {
- vector unsigned char temp = (vector unsigned char)ball_count;
- vector unsigned char four = (vector unsigned char)(4);
- vector unsigned char one = (vector unsigned char)(1);
-
- char1 = vec_perm(lines[j], lines[j],temp);
- temp =vec_sr(temp,four);
-
- char2 = vec_perm(lines[j], lines[j],temp);
- char2 =vec_sl(char2,four);
-
- char1 = vec_or(char1,char2);
-
- char1 =(vector unsigned char)vec_sl((vector unsigned short)char1,(vector unsigned short)four);
- char1 =(vector unsigned char)vec_sr((vector unsigned short)char1,(vector unsigned short)one);
-
- balls[i] = (vector unsigned short)char1;
- }
-
- }
-
- if (state == (lastState-1))
- {
- left_shitf[0] = Random() & 1;
- }
- }
-
-
- void ball_reset()
- {
- long i;
-
- vector unsigned short zero = (vector unsigned short)(0);
-
- for(i=0;i<42;i++)
- balls[i] = zero;
- }
-
-
- void draw_ball_line(vector unsigned short line, vector unsigned char * ptr)
- {
- long j = 0;
- vector unsigned char cline;
- vector unsigned char t1;
- vector unsigned char t2;
- vector unsigned char t3;
- vector unsigned char t4;
- vector unsigned char t5;
- vector unsigned char out;
-
- vector unsigned char one = (vector unsigned char)(1);
- vector unsigned char shift_1 = (vector unsigned char)(4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0);
- vector unsigned char shift_2 = (vector unsigned char)(2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0);
- vector unsigned char shift_3 = (vector unsigned char)(1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0);
- vector unsigned char white = (vector unsigned char)(-1);
- vector unsigned char color;
-
- color = *(vector unsigned char*)&(*(BallHand)ball_data)->color ;
-
- color = (vector unsigned char)vec_splat((vector unsigned long)color,0);
-
- cline = (vector unsigned char)line;
-
- t1 = vec_mergeh(cline,cline);
- t1 = vec_sr(t1,shift_1);
- {
- t2 = vec_mergeh(t1,t1);
- t2 = vec_sr(t2,shift_2);
- {
- t3 = vec_mergeh(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
-
- t3 = vec_mergel(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- }
-
- t2 = vec_mergel(t1,t1);
- t2 = vec_sr(t2,shift_2);
- {
- t3 = vec_mergeh(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- t3 = vec_mergel(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- }
-
- }
-
- t1 = vec_mergel(cline,cline);
- t1 = vec_sr(t1,shift_1);
- {
- t2 = vec_mergeh(t1,t1);
- t2 = vec_sr(t2,shift_2);
- {
- t3 = vec_mergeh(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- t3 = vec_mergel(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- }
- t2 = vec_mergel(t1,t1);
- t2 = vec_sr(t2,shift_2);
- {
- t3 = vec_mergeh(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- t3 = vec_mergel(t2,t2);
- t3 = vec_sr(t3,shift_3);
-
- t3 = vec_and(t3,one);
- t3 = (vector unsigned char)vec_cmpeq(t3,one);
- {
- t4 = vec_mergeh(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
-
- t4 = vec_mergel(t3,t3);
- {
- t5 = vec_mergeh(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
-
- t5 = vec_mergel(t4,t4);
- out = vec_sel(white,color, t5);
- ptr[j++] = out;
- }
- }
- }
- }
- }